iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
1

寫在前面

python是一種相當適合新手學習也相當適合高手使用的語言
具有簡單的語法跟結構,同時又具有相當多的函式庫可以做各種想得到跟想不到的事
想寫AI,有
想寫大數據,有
想寫網站,有
所以如果只是想學程式卻還沒有想好想做什麼的人很適合學python,
因為不管未來你想做什麼,都可以用上他

python版本

python目前分為2.X跟3.X兩種版本,
許多linux都已經有內建好python了,想確認你的linux預裝的版本可以使用以下的指令

python --version

但是由於python2.X的版本已經棄用了,
因此以下會使用python3做介紹
如果還沒有安裝的人可以先去這裡安裝
我在這裡等你,
其他已經有安裝好的學員們我們繼續往下看吧

首先,我會已經預設你已經學會十六進位與十進位的轉換,
並且基本了解程式語言在做什麼了,
還沒學過或蹺課的可以先去看昨天跟前天的主題C#

準備好之後就先在你的工作目錄建立一個附檔名為.py的檔案吧(檔名可以隨便取)

程式碼

用VScode開啟後在裡面貼上下面的程式碼

import math

# 定義開始

def t2h(number):
    num = int(number)
    for i in range(16):
        for j in range(16):
            for k in range(16):
                if math.pow(16,2)*i+math.pow(16,1)*j+math.pow(16,0)*k == num:
                    print(returnAE(i)+returnAE(j)+returnAE(k))

def returnAE(input):
    if input<10:
        return str(input)
    elif input==10:
        return "A"
    elif input==11:
        return "B"
    elif input==12:
        return "C"
    elif input==13:
        return "D"
    elif input==14:
        return "E"
    elif input==15:
        return "F"
    else:
        return "wrong"

def h2t(number):
    output = 0
    pow = len(number)
    i = 0
    while i < pow:
        output += int(AEreturn(number[i])*math.pow(16,pow-i-1))
        i+=1
    print(output)

def AEreturn(input):
    try :
        return int(input)
    except:
        if input=="A":
            return 10
        elif input=="B":
            return 11
        elif input=="C":
            return 12
        elif input=="D":
            return 13
        elif input=="E":
            return 14
        elif input=="F":
            return 15
        else:
            return 0

# 程式開始

print("Tell me what you want to do:")
convert = input("(1)T to H (2)H to T\n")

if convert == "1":
    number = input("Please enter the number\n")
    t2h(number)
elif convert == "2":
    number = input("Please enter the number\n")
    h2t(number)
else:
    print("Wrong select")

然後你就可以用

python convert.py

來執行看看

好,先停 可以告訴我main方法跑哪去了嗎?
不是說程式語言會從main方法開始?

C#從main方法當作進入點是因為C#是一種編譯式的語言,而python則是直譯式的語言
兩者最大的差異在於直譯式會從第一行開始執行,而編譯式則會從程式設定好的進入點開始

另外一種差別在於編譯式語言會先編譯後才能執行,而直譯式語言則可以直接執行

蛤? 可是昨天的C#也是直接開始執行阿

那是因為dotnet Core幫你處理掉了,明天我們會介紹Java,到時會更明顯,現在我們就先不提

;呢? 怎麼都沒看到

python是一種不需要;的語言
所以你不必再像C#那樣擔心自己某一行忘記加;而程式跑不起來的窘境

我們先從熟悉的輸入輸出開始吧

往下看到這兩行

print("Tell me what you want to do:")
convert = input("(1)T to H (2)H to T\n")

從這裡就可以看出python簡單的理由了吧
輸入跟輸出直接使用 print 跟 input簡單粗暴

等一下,讀取輸入時不需要指定型別嗎?

不需要,這是由於python是動態型別語言
變數的型別是在執行時才去做定義,而不是編譯時(畢竟python不需要編譯)
因此只有當執行到convert那一行的時候才會確定convert到底是什麼型別,而 = 右邊的input將會告訴他
所以大部分的情況下不需要事先定義變數的型別

這邊要注意輸出字串的最後兩個字

\n

這個是換行符號,告訴python這行結束後要換行
你可以把\n拿掉後執行看看會發生什麼事

我們往下看邏輯處理的部份

邏輯判斷 if

if convert == "1":
    number = input("Please enter the number\n")
    t2h(number)
elif convert == "2":
    number = input("Please enter the number\n")
    h2t(number)
else:
    print("Wrong select")

python內是沒有switch的喔,請用if else判斷吧

python的else if 被簡寫成elif

跟C#不一樣if條件不需要使用()包起來,也不需要使用{}告訴程式我們要執行的範圍
改用:跟縮排指定

縮排?

https://ithelp.ithome.com.tw/upload/images/20200906/20127836FhELa50Sun.png

縮排我們大部分都是使用tab鍵,在你的VScode右下角應該可以看到Space:4
那代表tab的寬度是四個空白鍵

在遇到下一個與自己相同的縮排(或是自己上一層的縮排)前,都是自己這個縮排的範圍
在python內掌控tab算是蠻重要的一環

if的其他部份跟C#類似就不提拉
下一行程式碼

t2h(number)

這個是我們的方法的使用,往上拉到我們程式裡面定義t2h方法的位置吧

方法

def t2h(number):
    num = int(number)
    for i in range(16):
        for j in range(16):
            for k in range(16):
                if math.pow(16,2)*i+math.pow(16,1)*j+math.pow(16,0)*k == num:
                    print(returnAE(i)+returnAE(j)+returnAE(k))

python內定義方法的關鍵字是def
結構大致上長這樣

def 方法名稱(輸入值):

由於是動態型別,因此不像C#需要指定輸入值與回傳值的型別
因此如果你只看方法的第一行,你甚至看不出來這個方法到底有沒有回傳值

轉型

注意,雖然python是動態型別,但是並不是弱型別的語言(也就是直譯器或編譯器不會幫你自動轉型),
因此當我們需要將這個字串與計算的數值做比較時就需要使用轉型

所以我們有了這一行

num = int(number)

這樣就可以將字串轉型成整數,如此一來就可以跟數值進行比對

迴圈

for i in range(16):
    for j in range(16):
        for k in range(16):

很酷吧? 比起C#的for迴圈更容易讓人讀懂總共會輪迴多少次
而且如果在()內放入陣列的話還會自動去遍歷整個陣列(簡單來說就是把陣列從第0個拿到最後一個)

如果你需要其他的算法可以這樣使用

for i in range(10, 1, -2): 
#10 8 6 4 2

for i in range(1,10):
#1 2 3 4 5 6 7 8 9

import

往下看到 if 裡面的這一行

if math.pow(16,2)*i+math.pow(16,1)*j+math.pow(16,0)*k == num:

這邊我們用到了函式庫math,於是我們必須在程式的一開頭將他引用進來

import math

有注意到C#的using跟python的import的差異嗎?

C#內我們說過using後你就可以省略using的語句

using System; //使用了這個之後你就可以省略System.Console.WriteLine的System了

但是python的邏輯不同,import比較像是提醒程式我們需要用到這個函式庫請他幫我們先準備好
所以當你在使用import的語句後還是需要打出import的詞(也就是math)

C#的Using是命名空間,而python的import是引用函式庫

接著跟C#一樣我們必須把得到的 ijk 轉成十六進位的符號

所以我們來到了

def returnAE(input):
    if input<10:
        return str(input)
    elif input==10:
        return "A"
    elif input==11:
        return "B"
    elif input==12:
        return "C"
    elif input==13:
        return "D"
    elif input==14:
        return "E"
    elif input==15:
        return "F"
    else:
        return "wrong"

同樣的因為沒有switch因此我們只能慢慢來一個一個判斷

注意到這裡

return str(input)

記得這裡要轉型喔,雖然因為動態型別的關係在這邊可以回傳int,
但是到

print(returnAE(i)+returnAE(j)+returnAE(k))

時python會因為你回傳的是int導致 + 時會使用int的相加而不是字串的相加

舉個簡單的例子
當你今天回傳"A","B","C"時,會使用字串的相加而變成"ABC"
但是如果你今天回傳的是2,8,7卻會變成17,
所以你得回傳"2","8","7"
這樣子可以理解了嗎?

迴圈while

往下看到將十六進位轉成十進位的方法吧

def h2t(number):
    output = 0
    pow = len(number)
    i = 0
    while i < pow:
        output += int(AEreturn(number[i])*math.pow(16,pow-i-1))
        i+=1
    print(output)

基本上前三行的宣告方式都跟C#一樣,只是不用指定型別
之後的while雖然沒有使用()跟{},但是有:來明確規範哪段是條件句哪段是執行句
注意到執行句裡頭 int( ) 的轉型,轉型的目標是

AEreturn(number[i])*math.pow(16,pow-i-1)

這一整段
這是為了要確保輸出時沒有小數點,
如果不使用的話程式效果會一樣,差別只在於輸出時的格式
詳細的情形就請大家自己試試看拉

錯誤處理

python一樣有錯誤處理喔,只是語法不太一樣

def AEreturn(input):
    try :
        return int(input)
    except:
        if input=="A":
            return 10
        elif input=="B":
            return 11
        elif input=="C":
            return 12
        elif input=="D":
            return 13
        elif input=="E":
            return 14
        elif input=="F":
            return 15
        else:
            return 0

註解

最後介紹一下python的註解

# 定義開始

python的單行註解是使用#
如果你需要多行註解可以使用三個"或三個'

'''
這是註解喔!
這是註解喔!
這是註解喔!
'''

print("Tell me what you want to do:")
convert = input("(1)T to H (2)H to T\n")

小結

我們先複習一下今天學的內容吧

  • 基本結構
    • 直譯式語言,程式進入點就位於程式的開頭
    • 行尾不需要;
    • 使用tab取代{}
  • 印出/讀取
    • 使用print輸出
    • input輸入
  • 方法的結構
    • 關鍵字是def
    • 動態型別,不需要提前告知輸入與輸出的型別
  • 邏輯控制
    • 沒有switch
    • if 不需要()跟{}
  • 迴圈控制
    • for 有好用的for range可以用
    • while 不需要(),{},但是有:
  • 型別
    • 動態,但是是強型別系統,沒辦法不轉型就比較字串跟數值
  • 冪次計算
    • math.pow()

這樣就介紹完python的基本語法了,相較於C#是不是簡單許多?
這也是為什麼python被稱為最適合新手學習的語言了

為什麼不在一開始介紹呢?

理由是因為我想介紹型別,但是動態型別的語言沒辦法確實的介紹這部份
也沒辦法介紹程式語言的結構

另外要注意的部份是根據python直譯器的不同可能會有在A電腦上可執行在B電腦上卻失敗的情況
比方說你的程式長這樣

https://ithelp.ithome.com.tw/upload/images/20200906/20127836HBQeNm6xmP.png

有可能會直接報錯,理由在於當程式執行到t2h時,你還沒有define t2h()的方法
(還記得我說過直譯式語言是一行一行執行的嗎?)

所以我才會把call t2h的程式放在最下面

但是某些線上的python直譯器這樣做是可行的,理由在於他會把程式先loading起來
而我們的本機不會這麼做

欸? 那為什麼t2h()去call returnAE是可行的?

這方面我沒有資料,我猜跟def有關
如果有其他人知道麻煩在下面留言回覆我

明天我們回到編譯式語言,介紹一個你可能在認識程式語言前就認識的程式語言:JAVA


上一篇
C# 如同精靈般優雅且高貴(下)
下一篇
JAVA 無所不在
系列文
你會十五種程式語言?不,我會十五種HelloWorld.為了避免這種狀況,因此寫了這篇:淺入淺出十五種程式語言30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
skycover
iT邦新手 4 級 ‧ 2020-09-06 12:54:36

如果有任何寫不清楚或是觀念沒有很明白的話請留言告知我
會盡快補上

如果有任何寫錯的地方也麻煩留言告知我
會盡快修正

感謝各位

我要留言

立即登入留言